/**
 * @fileoverview Giant Interective Group, Inc. Javascript Library v#version.
 * 该Javascript UI库是基于jQuery的扩展。
 * <pre>
 * Copyright (C) 2004-2009 Giant Interective Group, Inc. All rights reserved.
 * 版权所有 2004-2009 上海巨人网络科技有限公司
 * </pre>
 * 
 * @version #version, #date
 * @author  Songlu
 */
 
if(typeof giant === 'undefined')
    var giant = {};

if(typeof giant.ui === 'undefined')
	giant.ui = {};

(function($) {
	
	giant.ui.MenuItem = function(){
		var itm = {};
		itm.id = id;
		itm.name = name;
		itm.parent = parent;
		itm.children = children;
		itm.icon = icon;
		itm.action = action;		
		itm.index = index;
		return itm;
	}
	
	/**
	 * 创建一个菜单控件。
	 * 
	 * @class giant.ui.RichCalendar。Giant UI 的Menu控件。
	 * @example
	 * <pre>
	 * // 下面代码是菜单示例，可以直接写在页面中。
	 * &lt;div id="menu" class="menu"&gt;
	 *		&lt;ul class="lv1Ctn rootCtn"&gt;
	 *			&lt;li class="menuItem lv1"&gt;&lt;a target="" href="javascript:void(0);"&gt;文件&lt;/a&gt;
	 *			&lt;ul class="menuItemCtn lv2Ctn" style="display: none;"&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"
	 *					class="sub"&gt;新建&lt;/a&gt;
	 *					&lt;ul class="menuItemCtn lv3Ctn" style="display: none;"&gt;
     *							&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);" class="sub"&gt;普通文本1&lt;/a&gt;
	 *							&lt;ul class="menuItemCtn lv3Ctn" style="display: none;"&gt;
	 *								&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);" class="sub"&gt;普通文本2&lt;/a&gt;
	 *									&lt;ul class="menuItemCtn lv4Ctn" style="display: none;"&gt;
	 *										&lt;li class="menuItem lv4"&gt;&lt;a target="" href="javascript:void(0);"&gt;普通文本3&lt;/a&gt;
	 *										&lt;/li&gt;
	 *									&lt;/ul&gt;
	 *								&lt;/li&gt;
	 *								&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;HTML文本&lt;/a&gt;&lt;/li&gt;
	 *								&lt;li class="split" /&gt;
	 *								&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;Java文件&lt;/a&gt;&lt;/li&gt;
	 *								&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;C++文件&lt;/a&gt;&lt;/li&gt;
	 *								&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;Perl文件&lt;/a&gt;&lt;/li&gt;
	 *							&lt;/ul&gt;
	 *						&lt;/li&gt;
	 *						&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;HTML文本&lt;/a&gt;&lt;/li&gt;
	 *						&lt;li class="split" /&gt;
	 *						&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;Java文件&lt;/a&gt;&lt;/li&gt;
	 *						&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;C++文件&lt;/a&gt;&lt;/li&gt;
	 *						&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;Perl文件&lt;/a&gt;&lt;/li&gt;
	 *					&lt;/ul&gt;
	 *				&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;打开&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;关闭&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;全部关闭&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="split" /&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;保存&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;全部保存&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;另存为...&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="split" /&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;退出&lt;/a&gt;&lt;/li&gt;
	 *			&lt;/ul&gt;
	 *			&lt;/li&gt;
	 *			&lt;li class="menuItem lv1"&gt;&lt;a target="" href="javascript:void(0);"&gt;编辑&lt;/a&gt;
	 *			&lt;ul class="menuItemCtn lv2Ctn" style="display: none;"&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;撤销&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;恢复&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="split" /&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;剪切&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;复制&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;粘贴&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;删除&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;全选&lt;/a&gt;&lt;/li&gt;
	 *			&lt;/ul&gt;
	 *			&lt;/li&gt;
	 *			&lt;li class="menuItem lv1"&gt;&lt;a target="" href="javascript:void(0);"&gt;友情链接&lt;/a&gt;
	 *			&lt;ul class="menuItemCtn lv2Ctn" style="display: none;"&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="_blank"
	 *					href="http://www.google.com.cn"&gt;谷歌&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="_blank"
	 *					href="http://www.baidu.com"&gt;百度&lt;/a&gt;&lt;/li&gt;
	 *			&lt;/ul&gt;
	 *			&lt;/li&gt;
	 *			&lt;li class="menuItem lv1"&gt;&lt;a target="" href="javascript:void(0);"&gt;文件&lt;/a&gt;
	 *			&lt;ul class="menuItemCtn lv2Ctn" style="display: none;"&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"
	 *					class="sub"&gt;新建&lt;/a&gt;
	 *				&lt;ul class="menuItemCtn lv3Ctn" style="display: none;"&gt;
	 *					&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;普通文本&lt;/a&gt;&lt;/li&gt;
	 *					&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;HTML文本&lt;/a&gt;&lt;/li&gt;
	 *					&lt;li class="split" /&gt;
	 *					&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;Java文件&lt;/a&gt;&lt;/li&gt;
	 *					&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;C++文件&lt;/a&gt;&lt;/li&gt;
	 *					&lt;li class="menuItem lv3"&gt;&lt;a target="" href="javascript:void(0);"&gt;Perl文件&lt;/a&gt;&lt;/li&gt;
	 *				&lt;/ul&gt;
	 *				&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;打开&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;关闭&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;全部关闭&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="split" /&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;保存&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;全部保存&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;另存为...&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="split" /&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;退出&lt;/a&gt;&lt;/li&gt;
	 *			&lt;/ul&gt;
	 *			&lt;/li&gt;
	 *			&lt;li class="menuItem lv1"&gt;&lt;a target="" href="javascript:void(0);"&gt;编辑&lt;/a&gt;
	 *			&lt;ul class="menuItemCtn lv2Ctn" style="display: none;"&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;撤销&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;恢复&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="split" /&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;剪切&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;复制&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;粘贴&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;删除&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="" href="javascript:void(0);"&gt;全选&lt;/a&gt;&lt;/li&gt;
	 *			&lt;/ul&gt;
	 *			&lt;/li&gt;
	 *			&lt;li class="menuItem lv1"&gt;&lt;a target="" href="javascript:void(0);"&gt;友情链接&lt;/a&gt;
	 *			&lt;ul class="menuItemCtn lv2Ctn" style="display: none;"&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="_blank"
	 *					href="http://www.google.com.cn"&gt;谷歌&lt;/a&gt;&lt;/li&gt;
	 *				&lt;li class="menuItem lv2"&gt;&lt;a target="_blank"
	 *					href="http://www.baidu.com"&gt;百度&lt;/a&gt;&lt;/li&gt;
	 *			&lt;/ul&gt;
	 *			&lt;/li&gt;
	 *		&lt;/ul&gt;
	 *	&lt;/div&gt;
	 * 	var configs6 = {//页面中静态菜单
     *   	menu: '#menu', //menu的id
     *   	dateType:'html', //数据格式
     *       sync: true, //是否同步
     *       fire: 'mousedown' //触发 支持mouseover | mousedown，默认mouseover
     *   }
     *  //data的范例
     *  var data = {
	 *		name: 'root', //必选
	 *		sub: [
	 *			{
	 *				name: '文件',
	 *				sub: [
	 *			 		{
	 *			 			name: '新建',
	 *						sub: [{name: '普通文本'},{name: 'HTML文本'},{isSplit: true},{name: 'Java文件'},{name: 'C++文件'},{name: 'Perl文件'}]},
	 *					{
	 *			 			name: '打开'
	 *			 		},
	 *			 		{
	 *			 			name: '关闭'
	 *			 		},
	 *			 		{
	 *			 			name: '全部关闭'
	 *			 		},
	 *			 		{
	 *			 			isSplit: true //是否是分割条 true | false 默认false 若是true则不能还有name属性
	 *			 		},
	 *			 		{
	 *			 			name: '保存'
	 *					},
	 *					{
	 *						name: '全部保存'
	 *					},
	 *					{
	 *						name: '另存为...'
	 *					},
	 *					{
	 *						isSplit: true
	 *					},
	 *					{
	 *						name: '退出'
	 *					}
	 *				]
	 *			},
	 *			{
	 *				name: '编辑',
	 *				sub: [
	 *					{
	 *						name: '撤销'
	 *					},
	 *					{
	 *						name: '恢复'
	 *					},
	 *					{
	 *						isSplit: true
	 *					},
	 *					{
	 *						name: '剪切'
	 *					},
	 *					{
	 *						name: '复制'
	 *					},
	 *					{
	 *						name: '粘贴'
	 *					},
	 *					{
	 *						name: '删除'
	 *					},
	 *					{
	 *						name: '全选'
	 *					}
	 *				]
	 *			},
	 *			{
	 *				name: '友情链接',
	 *				sub: [
	 *					{
	 *						name: '谷歌',
	 *						url: 'http://www.google.com.cn',
	 *						target: '_blank'
	 *					},
	 *					{
	 *						name: '百度',
	 *						url: 'http://www.baidu.com',
	 *						target: '_blank'
	 *					}
	 *				]
	 *			}
	 *			]
     *   }
     * 	 var configs5 = {//根据json格式的data，创建菜单
     *   	menu: '#menu',
     *   	data: data,
     *       dataType: 'json',
     *       sync: true,
     *       fire: 'mousedown'
     *   }
	 *	 var configs4 = {//根据ajax请求的json格式的data，创建菜单
     *   	menu: '#menu',
     *   	url: 'data.txt',
     *       dataType: 'json',
     *       sync: false,
     *       fire: 'mousedown'
     *   }
	 *	$(document).ready(function(){
	 *	    menu6 = new giant.ui.Menu(configs6);
	 *	})
	 * </pre>
	 * @constructor
	 * @param {Object} configs 日历的属性集。
	 */
	giant.ui.Menu = function(configs){
		this.initMenu(configs);	
	};
	/**
     * 菜单节点容器模板
     */
	giant.ui.Menu.itmCtnTemplate = '<ul class="menuItemCtn #{lv}"></ul>'
	/**
     * 菜单节点模板
     */
	giant.ui.Menu.itmTemplate = '<li class="menuItem #{lv}"></li>';
	/**
     * 菜单节点内容模板
     */
	giant.ui.Menu.itmNameTemplate = '<a href="#{url}" target="#{target}">#{name}</a>';
	/**
     * 菜单分割条模板
     */
	giant.ui.Menu.split = '<li class="split"></li>';

	giant.ui.Menu.prototype = {
		initMenu: function(configs){
			$this = this;
			var defaultConfigs = {
				menu: '#menu',
		        dataType: 'html',
		        sync: false,
		        fire: 'mouseover'
			}
			jQuery.extend(defaultConfigs, configs||{});
			configs = defaultConfigs;
			
			configs.elmRoot = $(configs.menu);
			configs.lv = 0;
			configs.lastShow = null;
			configs.isActive = false;
			
			if(typeof configs.elmRoot == 'undefined') {
				alert('没有发现菜单根节点元素');
				return;
			}
			
			if(configs.sync){
				
				//同步加载
				if(configs.dataType == 'json'){
					configs.elmRoot.html('');
					$this.build(configs.elmRoot, configs.data, configs.lv, configs);
				} else {
					$this.buildByHtml(configs);
				}
				if(configs.fire != 'mouseover'){
					$(document).bind('mousedown',function(){
						$('.menuItemCtn').hide();
						configs.isActive = false;
						configs.lastShow && configs.lastShow.children('.current').removeClass('current');
					})
				}
				
			}else{
				configs.elmRoot.html('');
				//异步加载
				$.ajax({
					type:'GET',
					url: configs.url,
					dataType: configs.dataType,
					success: function(data){
						$this.build(configs.elmRoot, data, configs.lv, configs);
						if(configs.fire != 'mouseover'){
							$(document).bind('mousedown',function(){
								$('.menuItemCtn').hide();
								configs.isActive = false;
								configs.lastShow && configs.lastShow.children().removeClass('current');
							})
						}
					}			
				})
				
			}
		},
		_otherHide: function(itm){
			itm.nextAll().find('.menuItemCtn').hide();
			itm.prevAll().find('.menuItemCtn').hide();
			itm.nextAll().find('.current').removeClass('current');
			itm.prevAll().find('.current').removeClass('current');
		},
		_itselfHide: function(itm){
			itm.find('.menuItemCtn').hide();
			itm.find('.current').removeClass('current');
		},
		_itselfShow: function(itm){
			itm.children('.menuItemCtn').show();
			itm.children('a').addClass('current');
		},
		/**
	     * 强制IE重新渲染
	     */
		handleIEhasLayout: function(){
		    document.body.style.zoom = 1.1;
		    document.body.style.zoom = '';
		},
		/**
	     * 通过json格式数据创建菜单
	     * @param {Object} configs 参数信息。
	     */
		buildByHtml: function(configs){
			$this = this;

			$('.split').bind('mousedown', function(event){
				event.stopPropagation();							
			});
			
			$('.menuItem').each(function(i){
				if($(this).parent().hasClass('rootCtn')){
					if(configs.fire == 'mousedown'){
						$(this).bind(configs.fire,function(event){
							event.stopPropagation();
							
							if(event.button != 2){
								configs.isActive = !configs.isActive;
								$this._otherHide($(this));
								if(configs.isActive){
									$this._itselfShow($(this));
									configs.lastShow = $(this);
								}else{
									$this._itselfHide($(this));
								}
								$this.handleIEhasLayout();
							}
						});
					}else{
						$(this).bind('mouseover',function(event){
							if(configs.lastShow && configs.lastShow != $(this)){
								$this._otherHide($(this));
							}
							$this._itselfShow($(this));
							$this.handleIEhasLayout();
							configs.lastShow = $(this);
						});
					}
					if(configs.fire != 'mouseover'){
						$(this).bind('mouseover',function(event){
							if(configs.lastShow && configs.lastShow != $(this) && configs.isActive){
								$this._otherHide($(this));
								$this._itselfShow($(this));
								$this.handleIEhasLayout();
							}
							configs.lastShow = $(this);
						});
					}
				}else{
					$(this).bind('mouseover', function(event){
						if(configs.lastShow && configs.lastShow != $(this)){
							$this._otherHide($(this));
							$this._itselfShow($(this));
							$this.handleIEhasLayout();
						}
						configs.lastShow = $(this);
					});
					$(this).bind('mousedown', function(event){
						event.stopPropagation();
					});
				}
			})
		},
		/**
	     * 通过json格式数据创建菜单
	     * @param {Object} elmCtn menuItem容器。
	     * @param {Object} data 数据内容。
	     * @param {Number} lv menuItem层级。
	     */
		build: function(elmCtn, data, lv, configs){
			$this = this;
			lv++;
			if(data.name && data.name != 'root'){
				var _name = $(giant.ui.Menu.itmNameTemplate.replace(/#{url}/, data.url || 'javascript:void(0);').replace(/#{name}/, data.name).replace(/#{target}/, data.target || ''));
				if(data.sub && lv != 2){
					_name.addClass('sub');
				}
				elmCtn.append(_name);
			}
			if(data.sub){
				var _itmCtn = $(giant.ui.Menu.itmCtnTemplate.replace(/#{lv}/, 'lv'+lv+'Ctn'));
				if(data.name && data.name != 'root') {
					_itmCtn.hide();
				}else{
					_itmCtn.removeClass('menuItemCtn');
					_itmCtn.addClass('rootCtn')
				}
				
				elmCtn.append(_itmCtn);
				$.each(data.sub, function(index, itm){
					if(itm.isSplit){
						var _split = $(giant.ui.Menu.split);
						_split.bind('mousedown', function(event){
							event.stopPropagation();							
						})
						_itmCtn.append(_split);
					}else{
						var _itm = $(giant.ui.Menu.itmTemplate.replace(/#{lv}/, 'lv'+lv));
						if(data.name == 'root'){
							if(configs.fire == 'mousedown'){
								_itm.bind(configs.fire,function(event){
									event.stopPropagation();
									
									if(event.button != 2){
										configs.isActive = !configs.isActive;
										$this._otherHide($(this));
										if(configs.isActive){
											$this._itselfShow($(this));
											configs.lastShow = $(this);
										}else{
											$this._itselfHide($(this));
										}
										$this.handleIEhasLayout();
									}
								});
							}else{
								_itm.bind('mouseover',function(event){
									if(configs.lastShow && configs.lastShow != $(this)){
										$this._otherHide($(this));
									}
									$this._itselfShow($(this));
									$this.handleIEhasLayout();
									configs.lastShow = $(this);
								});
							}
							if(configs.fire != 'mouseover'){
								_itm.bind('mouseover',function(event){
									if(configs.lastShow && configs.lastShow != $(this)&&configs.isActive){
										$this._otherHide($(this));
										$this._itselfShow($(this));
										$this.handleIEhasLayout();
									}
									configs.lastShow = $(this);
								});
							}
						} else {
							_itm.bind('mouseover', function(event){
								if(configs.lastShow && configs.lastShow != $(this)){
									$this._otherHide($(this));
									$this._itselfShow($(this));
									$this.handleIEhasLayout();
								}
								configs.lastShow = $(this);
							});
							_itm.bind('mousedown', function(event){
								event.stopPropagation();
							});
						}
						_itmCtn.append(_itm);
						$this.build(_itm, itm, lv, configs);
					}
				})
			}
		}
	}
})(jQuery);